﻿using System;
using System.Data;
using System.Linq;
using System.Collections.Generic;
using System.Web.UI.WebControls;
using Emporium_Web.Controls;
using Emporium_Web.Enums;
using Emporium_Web.DBML;
using System.Linq.Expressions;

namespace Emporium_Web
{
    public partial class ColoresItemForm : System.Web.UI.Page
    {
        /// <summary>
        /// Es el código de estilo
        /// </summary>
        private int EstiloId
        {
            get { return ViewState["RequestCodeEstilo"] == null ? -1 : (int)ViewState["RequestCodeEstilo"]; }
            set { ViewState["RequestCodeEstilo"] = value; }
        }

        /// <summary>
        /// Es el código de variante
        /// </summary>
        private int VarianteId
        {
            get { return ViewState["VarianteId"] == null ? -1 : (int)ViewState["VarianteId"]; }
            set { ViewState["VarianteId"] = value; }
        }

        /// <summary>
        /// Es el código de componente
        /// </summary>
        private int ComponenteId
        {
            get { return ViewState["ComponenteId"] == null ? -1 : (int)ViewState["ComponenteId"]; }
            set { ViewState["ComponenteId"] = value; }
        }


        /// <summary>
        /// Es el código de variante item
        /// </summary>
        private int VarianteItemId
        {
            get { return ViewState["VarianteItemId"] == null ? -1 : (int)ViewState["VarianteItemId"]; }
            set { ViewState["VarianteItemId"] = value; }
        }       

        /// <summary>
        /// Contiene la operación que se realizará en el formulario
        /// </summary>
        private AccionesForm Operacion
        {
            get { return ViewState["Operation"] == null ? AccionesForm.Consultar : (AccionesForm)ViewState["Operation"]; }
            set { ViewState["Operation"] = value; }
        }

        /// <summary>
        /// Los componentes.
        /// </summary>
        private List<DE_VarianteItemCombinacionColor> VarianteItemCombinacionColorTemp
        {
            get
            {
                return Session["VarianteItemCombinacionColorTemp"] == null ? null : (List<DE_VarianteItemCombinacionColor>)Session["VarianteItemCombinacionColorTemp"];
            }
            set
            {
                Session["VarianteItemCombinacionColorTemp"] = value;
            }
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            try
            {
                errorMessage.Visible = false;
                warningMessage.Visible = false;

                if (!IsPostBack)
                {        
                    Master.ActualizaMenu(MenuPrincipal.Desarrollo, (int)MenuDesarrollo.Estilo);

                    Master.AgregarBreadcrumb("Estilo", "#", true);
                    Master.AgregarBreadcrumb("Listado", "EstiloList.aspx", false);
                    Master.AgregarBreadcrumb("Consumos", "#", false);                    
                    Master.AgregarBreadcrumb("Colores", "#", false);
                    leyendaForm.Text = Resources.Leyendas.FormAdicionar;

                    int EstiloId = 0;
                    if (Request.QueryString["EstiloId"] != null && Int32.TryParse(Request.QueryString["EstiloId"], out EstiloId))
                    {
                        this.EstiloId = EstiloId;
                    }
                    int VarianteId = 0;
                    if (Request.QueryString["VarianteId"] != null && Int32.TryParse(Request.QueryString["VarianteId"], out VarianteId))
                    {
                        this.VarianteId = VarianteId;
                    }
                    int ComponenteId = 0;
                    if (Request.QueryString["ComponenteId"] != null && Int32.TryParse(Request.QueryString["ComponenteId"], out ComponenteId))
                    {
                        this.ComponenteId = ComponenteId;
                    }
                    int VarianteItemId = 0;
                    if (Request.QueryString["VarianteItemId"] != null && Int32.TryParse(Request.QueryString["VarianteItemId"], out VarianteItemId))
                    {
                        this.VarianteItemId = VarianteItemId;
                    }

                    Session["EstiloIdxCombinacion"] = EstiloId;

                    VarianteItemCombinacionColorTemp = new List<DE_VarianteItemCombinacionColor>();                    
                    LlenarDatosDefault();
                    ListarVarianteCombinacionColor();
                    CargarVarianteCombinacionColor();
                }
            }
            catch (Exception x)
            {
                lblErrorMessage.Text = x.Message;
                errorMessage.Visible = true;
            }
        }

        protected void btnGrabar_Click(object sender, EventArgs e)
        {
            try
            {
                Grabar();
                Response.Redirect("ConsumosXEstilo.aspx?VarianteId=" + this.VarianteId + "&ComponenteId=" + this.ComponenteId + "&EstiloId=" + this.EstiloId + "&VarianteItemId=" + this.VarianteItemId);
            }
            catch (Exception x)
            {
                lblErrorMessage.Text = x.Message;
                errorMessage.Visible = true;
            }
        }

        protected void btnAtras_Click(object sender, EventArgs e)
        {
            Response.Redirect("ConsumosXEstilo.aspx?VarianteId=" + this.VarianteId + "&ComponenteId=" + this.ComponenteId + "&EstiloId=" + this.EstiloId + "&VarianteItemId=" + this.VarianteItemId);
        }

        /// <summary>
        /// Llena los mensajes de error de las validaciones del formulario.
        /// </summary>
        private void EstablecerValidaciones()
        {
           
        }       

        /// <summary>
        /// Llena los datos del formulario con la información de la variante y componente.
        /// </summary>        
        private void LlenarDatosDefault()
        {
            TablasDataContext database = new TablasDataContext();

            var estilo = database.DE_Estilo.First(c => c.Id == this.EstiloId);
            var variante = database.DE_Variante.First(c => c.Variante_Id == this.VarianteId);
            var componente = database.DE_Componente.First(c => c.Componente_Id == this.ComponenteId);
            var varienteItem = database.DE_VarianteItem.First(c => c.VarIte_Id == this.VarianteItemId);
            
            TG_Item item = null; TG_Tela tela = null;
            if (componente.Componente_TipoItem == 'I')
            {
                item = database.TG_Item.First(c => c.Item_Id == varienteItem.Item_Id);
                txtItem.Text = item.Item_Descripcion;
            }
            else
            {
                tela = database.TG_Tela.First(c => c.Tela_Id == varienteItem.Tela_Id);
                txtItem.Text = tela.Tela_Descripcion;
            }

            txtEstilo.Text = estilo.Descripcion;
            txtVariante.Text = variante.Variante_Descripcion;
            txtComponente.Text = componente.Componente_Descripcion; 
        }


        /// <summary>
        /// Llena los datos del formulario con la información del estilo.
        /// </summary>        
        private void LlenarDatosForm()
        {
            TablasDataContext database = new TablasDataContext();

            DE_VarianteItem varianteItem = (from varianteItems in database.DE_VarianteItem
                                            where varianteItems.VarIte_Id == this.VarianteItemId
                                            select varianteItems).First();           
        }


        private void ListarVarianteCombinacionColor()
        {
            TablasDataContext database = new TablasDataContext();

            var listaVarianteCombinacionColor = from varianteCombinacionColor in database.DE_VarianteItemCombinacionColor
                                                where varianteCombinacionColor.VarIte_Id == this.VarianteItemId
                                                select varianteCombinacionColor;

            if (listaVarianteCombinacionColor.Count() > 0)
                VarianteItemCombinacionColorTemp = listaVarianteCombinacionColor.ToList();
        }

        private void CargarVarianteCombinacionColor()
        {
            if (VarianteItemCombinacionColorTemp.Count() > 0)
            {
                gvCombinacionColor.DataSource = VarianteItemCombinacionColorTemp;
                gvCombinacionColor.DataBind();
            }
            else
            {
                gvCombinacionColor.DataSource = new List<DE_VarianteItemCombinacionColor>() { new DE_VarianteItemCombinacionColor() };
                gvCombinacionColor.DataBind();
                gvCombinacionColor.Rows[0].Cells[0].Text = string.Empty;
                gvCombinacionColor.Rows[0].Cells[1].Text = string.Empty;
                gvCombinacionColor.Rows[0].Cells[2].Text = string.Empty;
                gvCombinacionColor.Rows[0].Cells[3].Text = string.Empty;             
            }
        }

        private void Grabar()
        {
            try
            {

                TablasDataContext database = new TablasDataContext();

                var listaVarianteCombinacionColor = from varianteCombinacionColor in database.DE_VarianteItemCombinacionColor
                                                    where varianteCombinacionColor.VarIte_Id == this.VarianteItemId
                                                    select varianteCombinacionColor;


                //Se elimana las variantesCombinacionColor
                foreach (var item in listaVarianteCombinacionColor)
                {
                    if (!VarianteItemCombinacionColorTemp.Exists(c => c.VarIteComCol_Id == item.VarIteComCol_Id))
                    {
                        database.DE_VarianteItemCombinacionColor.DeleteOnSubmit(item);
                    }
                }

                //Se insertan las variantesCombinacionColor
                foreach (var itemTemp in VarianteItemCombinacionColorTemp)
                {
                    var variantesCombinacionColor = database.DE_VarianteItemCombinacionColor.FirstOrDefault(c => c.VarIteComCol_Id == itemTemp.VarIteComCol_Id);
                    if (variantesCombinacionColor == null)
                    {
                        database.DE_VarianteItemCombinacionColor.InsertOnSubmit(new DE_VarianteItemCombinacionColor()
                        {                            
                            Combinacion_Id = itemTemp.Combinacion_Id,
                            Variante_Id = itemTemp.Variante_Id,
                            Color_Id = itemTemp.Color_Id,
                            Componente_Id = itemTemp.Componente_Id,
                            VarIte_Id = itemTemp.VarIte_Id
                        });
                    }
                }
                database.SubmitChanges();
                CargarVarianteCombinacionColor();

            }
            catch (Exception x)
            {
                lblErrorMessage.Text = x.Message;
                errorMessage.Visible = true;
            }
        }

        protected void btnComponentesColorAdicionar_Click(object sender, EventArgs e)
        {
            divDetalle.Visible = true;
            divAcciones.Visible = false;
            combinacionSearch.CodigoSeleccionado = 0;
            combinacionSearch.DescripcionSeleccionado = string.Empty;
            colorSearch.CodigoSeleccionado = 0;
            colorSearch.DescripcionSeleccionado = string.Empty;
        }

        protected void btnComponentesColorEliminar_Click(object sender, EventArgs e)
        {
            try
            {
                int codigo = 0;
                if (Int32.TryParse(hdnSeleccion.Value.ToString(), out codigo))
                {
                    var talla = VarianteItemCombinacionColorTemp.Find(c => c.VarIteComCol_Id == codigo);
                    VarianteItemCombinacionColorTemp.Remove(talla);                   
                    CargarVarianteCombinacionColor();
                    hdnSeleccion.Value = string.Empty;
                }
                else
                {
                    warningMessage.Visible = true;
                    lblWarningMessage.Text = Resources.MensajesValidacion.NoItemSelected;
                }               
            }
            catch (Exception x)
            {
                lblErrorMessage.Text = x.Message;
                errorMessage.Visible = true;
            }            
        }

        protected void btnAceptar_Click(object sender, EventArgs e)
        {
            divDetalle.Visible = false;
            divAcciones.Visible = true;

            TablasDataContext database = new TablasDataContext();
         
            if (!VarianteItemCombinacionColorTemp.Exists(c => c.VarIte_Id == this.VarianteItemId &&
                                                        c.Variante_Id == this.VarianteId &&
                                                        c.Componente_Id == this.ComponenteId &&
                                                        c.Color_Id == this.colorSearch.CodigoSeleccionado &&
                                                        c.Combinacion_Id == this.combinacionSearch.CodigoSeleccionado))
            {
                var combinacionColor = database.TG_CombinacionColor.FirstOrDefault(c => c.Combinacion_Id == this.combinacionSearch.CodigoSeleccionado &&
                                                                                        c.Color_Id == this.colorSearch.CodigoSeleccionado);
                if (combinacionColor != null)
                {
                    DE_VarianteItemCombinacionColor item = new DE_VarianteItemCombinacionColor()
                    {
                        VarIte_Id = this.VarianteItemId,
                        Variante_Id = this.VarianteId,
                        Componente_Id = this.ComponenteId,
                        Color_Id = this.colorSearch.CodigoSeleccionado,
                        Combinacion_Id = this.combinacionSearch.CodigoSeleccionado,
                        TG_CombinacionColor = combinacionColor
                    };

                    VarianteItemCombinacionColorTemp.Add(item);
                }
            }           
            CargarVarianteCombinacionColor();
        }

        protected void btnCancelar_Click(object sender, EventArgs e)
        {
            divDetalle.Visible = false;
            divAcciones.Visible = true;
        }
    }
}